import Dep from "./dep.js";
export default class Watcher {
  vm;
  exp;
  cb;
  value;
  dirty = false;
  lazy = false;
  // vm，因为实现了数据代理，所以相当于data
  // exp，即访问路径，如'count.total'
  // cb: 依赖回调
  constructor(vm, exp, cb, options = {}) {
    this.vm = vm;
    this.exp = exp;
    this.cb = cb;
    // 如果不传默认为false
    console.log("options :>> ", options);

    console.log("this :>> ", this);
    this.lazy = !!options.lazy;
    // 如果是懒惰的，那么刚开始就应该是肮胀的
    this.dirty = this.lazy;
    // 如果不是懒惰的，才需要立即获取值
    if (!this.lazy) {
      this.value = this.get();
    }
  }
  get() {
    Dep.target = this;
    const _data = this.vm._data;
    let value;
    if (typeof this.exp === "function") {
      value = this.exp.call(this.vm);
    } else {
      value = _data[this.exp];
    }
    Dep.target = null;
    return value;
  }
  update(newValue, oldValue) {
    // 在dep的notify方法中会调用watcher中的update
    // 此时如果是惰性watcher则不执行回调
    // 但是此时有依赖变更，所以我们将watcher上的dirty属性变为true
    if (this.lazy) {
      this.dirty = true;
    } else {
      //todo: 调用依赖回调cb
      // 这个位置可以实现新老数据的回传和判断数据是否发生修改
      this.cb && this.cb.call(this.vm, newValue, oldValue);
    }
  }
}
